/**
 * 算式类 - 封装一个加减法算式的所有属性和行为
 * 支持包含负数和100以上的数的加减法运算
 * 
 * @author System Designer
 * @version 1.0
 */
public class Expression {
    // 成员变量（私有）
    private int num1;      // 第一个操作数
    private int num2;      // 第二个操作数
    private char operator; // 运算符（'+' 或 '-'）
    private int result;    // 计算结果
    
    /**
     * 默认构造函数
     */
    public Expression() {
        this.num1 = 0;
        this.num2 = 0;
        this.operator = '+';
        this.result = 0;
    }
    
    /**
     * 带参数的构造函数
     * @param num1 第一个操作数
     * @param operator 运算符
     * @param num2 第二个操作数
     */
    public Expression(int num1, char operator, int num2) {
        this.num1 = num1;
        this.operator = operator;
        this.num2 = num2;
        calculate(); // 自动计算结果
    }
    
    /**
     * 计算结果
     */
    public void calculate() {
        if (operator == '+') {
            result = num1 + num2;
        } else if (operator == '-') {
            result = num1 - num2;
        }
    }
    
    /**
     * 格式化算式字符串（不包含答案）
     * @return 格式化的算式字符串
     */
    public String formatExpression() {
        return String.format("%3d %c %3d", num1, operator, num2);
    }
    
    /**
     * 格式化算式字符串（包含答案）
     * @return 包含答案的格式化字符串
     */
    public String formatWithAnswer() {
        return String.format("%3d %c %3d = %3d", num1, operator, num2, result);
    }
    
    /**
     * 获取第一个操作数
     * @return 第一个操作数
     */
    public int getNum1() {
        return num1;
    }
    
    /**
     * 获取第二个操作数
     * @return 第二个操作数
     */
    public int getNum2() {
        return num2;
    }
    
    /**
     * 获取运算符
     * @return 运算符
     */
    public char getOperator() {
        return operator;
    }
    
    /**
     * 获取计算结果
     * @return 计算结果
     */
    public int getResult() {
        return result;
    }
    
    /**
     * 设置第一个操作数
     * @param num1 第一个操作数
     */
    public void setNum1(int num1) {
        this.num1 = num1;
        calculate(); // 重新计算结果
    }
    
    /**
     * 设置第二个操作数
     * @param num2 第二个操作数
     */
    public void setNum2(int num2) {
        this.num2 = num2;
        calculate(); // 重新计算结果
    }
    
    /**
     * 设置运算符
     * @param operator 运算符
     */
    public void setOperator(char operator) {
        this.operator = operator;
        calculate(); // 重新计算结果
    }
    
    /**
     * 判断是否为加法运算
     * @return true表示加法，false表示减法
     */
    public boolean isAddition() {
        return operator == '+';
    }
    
    /**
     * 判断是否为减法运算
     * @return true表示减法，false表示加法
     */
    public boolean isSubtraction() {
        return operator == '-';
    }
    
    /**
     * 判断算式是否有效（加法和不超过100，减法差不小于0）
     * @return true表示算式有效，false表示无效
     */
    public boolean isValid() {
        if (operator == '+') {
            return result <= 100;
        } else if (operator == '-') {
            return result >= 0;
        }
        return false;
    }
    
    /**
     * 重写toString方法
     * @return 包含答案的字符串表示
     */
    @Override
    public String toString() {
        return formatWithAnswer();
    }
    
    /**
     * 重写equals方法，用于比较两个算式是否相等
     * @param obj 要比较的对象
     * @return true表示算式相等，false表示不等
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        
        Expression that = (Expression) obj;
        return num1 == that.num1 && 
               num2 == that.num2 && 
               operator == that.operator;
    }
    
    /**
     * 重写hashCode方法
     * @return 哈希码
     */
    @Override
    public int hashCode() {
        return num1 * 31 + num2 * 31 + operator;
    }
}